import os
import tempfile
from werkzeug.utils import secure_filename
from pdf2docx import Converter

class PDFConverter:
    def convert_to_word(self, pdf_file, output_filename='converted.docx'):
        """
        PDF转Word核心功能
        :param pdf_file: 上传的PDF文件
        :param output_filename: 输出文件名
        :return: 转换后的文件路径
        """
        # 创建输出目录（如果不存在）
        output_dir = os.path.join(os.getcwd(), 'output')
        if not os.path.exists(output_dir):
            try:
                os.makedirs(output_dir, exist_ok=True)
                print(f"已创建输出目录: {output_dir}")
            except Exception as e:
                raise RuntimeError(f"无法创建输出目录: {str(e)}")
        
        secure_pdf_name = secure_filename(pdf_file.filename)
        
        # 验证输出路径
        if not os.path.isdir(output_dir):
            raise RuntimeError(f"输出目录不存在: {output_dir}")
        
        # 确保输出文件名有效
        if not output_filename.endswith('.docx'):
            output_filename += '.docx'
        secure_output = secure_filename(output_filename)
        
        # 验证上传文件是否为PDF
        if not secure_pdf_name.lower().endswith('.pdf'):
            raise ValueError("仅支持PDF文件")
        if not secure_output:
            raise ValueError("无效的输出文件名")
        
        # 确保文件名以.docx结尾
        if not secure_output.lower().endswith('.docx'):
            secure_output += '.docx'
        
        # 使用临时文件确保资源正确释放
        temp_dir = tempfile.mkdtemp()
        pdf_path = os.path.join(temp_dir, secure_pdf_name)
        output_path = os.path.abspath(os.path.join(output_dir, secure_output))
        
        try:
            # 使用上下文管理器保存文件
            with open(pdf_path, 'wb') as f:
                pdf_file.save(f)
            
            # 执行转换
            cv = Converter(pdf_path)
            try:
                cv.convert(output_path)
            finally:
                cv.close()
                
            return output_path
            
        finally:
            # 清理临时文件
            try:
                if os.path.exists(pdf_path):
                    os.remove(pdf_path)
                os.rmdir(temp_dir)
            except Exception as e:
                print(f"清理临时文件失败: {e}") 